package FileInputStream.project;

import java.io.FileInputStream;
import java.io.IOException;

/*
    FileInputStreamw文件字节输入流：
         它 extends InoutStream（抽象类）

      使用步骤：
        1.创建一个 FileInputStreamw对象，在构造方法中绑定要读取的文件数据
        2.调用 FileOutputStreamw对象中的read（）方法，读取文件
            读取方法:1.int read():从该输入流读取下一个数据字节(读取文件中的一个字节并返回，之后每一次执行都会从下一个开始（就相当于指针指定下一个），读取到文件的末尾返回-1)
                    2.int read(byte[] b) 从该输入流读取最多 byte.length个字节的数据到字节数组。(一次读取多个字节)

        3.释放资源 close（）
 */
public class PracticeMain {
    public static void main(String[] args) throws IOException { //这3步都会发生异常，所以要向上抛给它的父类
       // 1.创建一个 FileInputStreamw对象，在构造方法中绑定要读取的文件数据
        FileInputStream fis = new FileInputStream("E:\\idea\\IntelliJ IDEA 2020.3\\perject_idea\\20210325\\a.txt");

        //2.调用 FileOutputStreamw对象中的read（）方法，读取文件
        //方法1：一次读取一个字节：
//        int len = 0;//定义一个接收读取结果的变量
//        while ((len = fis.read()) != -1){  //不确定文件里有多少内容，用while循环（不确定循环次数用while，确定用for）
//            System.out.print(len);          //知道读取结束，返回给len  -1，读取结束
//            System.out.print((char)len);//强制转为字符型
//        }
        System.out.println();
        System.out.println("===========================");

        /*
            方法2：
            一次读取多个字节:int read(byte[] b):
            需要使用到字符串：用到的是String类中的构造方法
                                String(byte[] bytes , int offset , int lenght):
                                       作用：把读取到的字节数组转换为字符串，其中offset:数组的开始所引处
                                                                          lenght:转换的字符个数
            步骤：1.先创建byte类型的数组（用来存放读取到的字节，提高效率），并给定长度，一般是1024，或者1024的倍数（每次可以读取的字节数）
                 2.将读取到的字节放入到数组中，并返回读取的字节个数
                 3.使用String(byte[] bytes , int offset , int lenght)构造方法将读取到的数组字节转换为字符串
         */
        byte[] bytes = new byte[1024];//定义存放多少字节数的数组
        int len2 = 0;//定义一个int变量用来存放读取字节数的个数
        while ((len2 = fis.read(bytes)) != -1){
            System.out.println(new String(bytes,0,len2)); //使用构造方法将字节数组转换为字符串，通过输出语句打印出来
                                                                //注意：转换结束处用len2是为了只转换有效的字节数，无效的就不用转换了
        }

        //3.释放资源 close（）
        fis.close();
    }
}
